Communication between devices connected through a network may begin with the generation of a transaction request by a device that, by external assignment or internal programming, is an “initiator.” An initiator may be a programmable processor, or an individual thread on a processor. A target device may be a data memory, for example a direct memory access (DMA) random access memory (RAM). The transaction request includes the identifier (ID) of the target device, or “target ID,” and a command specifying the particular kind of transaction that is requested, for example a data read or data write. The network routes the transaction request to the target device using the target ID. The target device then performs the requested transaction.
For certain transactions, such as a data read, the target device generates a response, e.g., data read from the target device, and the network must be capable of routing this response back to the initiator. One means for routing the response back to the initiator is to assign each initiator a unique initiator ID, include this initiator ID in each transaction request, have the target device likewise include the initiator ID in its response, and configure the network to route the response back to the initiator using its ID. However, this requires that each initiator ID be unique, and since initiators such as threads are temporary, it necessitates a system-wide authority for dynamically assigning and retiring IDs, and maintaining tracking or routing information throughout network.
Another means for routing target device responses to transaction requests back to the initiator is by incrementally appending to the transaction request, as it passes from the initiator through successive network ports or other interfaces and/or through path segments in the network to reach the target device a path ID for each of the path segments. The appending may be to the front of, i.e., “prepended” to, the transaction request. When the transaction request reaches its target it has prepended to it the path ID of every port or interface and/or path segment through which it passed. The target device then appends, or prepends this same succession of path IDs to its response to the transaction request. The network then routes the response through the same path segments, in reverse order, using the prepended sequence of path IDs.
The prepending scheme, although not requiring a system-wide authority for dynamically assigning unique IDs for initiators, or maintaining and updating routing tables throughout the network, may also have significant costs. In particular, as the number of levels of the network increases the number of successive path segment IDs that must be prepended to the transaction requests increases. Also, as has been long known to persons of ordinary skill in the art, prepending schemes may require monitoring at each succeeding network level an activity status regarding particular sequences of path IDs. One result is that the total number of bits required for the network to implement the scheme increases in substantially exponential manner.